import axios from 'axios'
import globalVariable from '@/api/global_variable.js'

// 设置 POST 请求头
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'

// 在向服务器发送前，修改请求数据(只能用在 'PUT', 'POST' 和 'PATCH' 这几个请求方法)
// axios.defaults.transformRequest = [(data) => { return JSON.stringify(data) }]

// 在传递给 then/catch 前，允许修改响应数据
// axios.defaults.transformResponse = [(data) => { return JSON.parse(data) }]

// 配置 CORS 跨域
// 表示跨域请求时是否需要使用凭证
axios.defaults.withCredentials = true
axios.defaults.dataType = 'json'

axios.defaults.crossDomain = true

axios.defaults.emulateJSON = true

// 设置超时
axios.defaults.timeout = 40000

// 拦截器的说明
// 1、interceptor必须在请求前设置才有效。
// 2、直接为axios全局对象创建interceptor， 会导致全局的axios发出的请求或接收的响应都会被拦截到， 所以应该使用axios.create() 来创建单独的axios实例。
// 设置地址

// 创建axios实例
let instance = axios.create({
    baseURL: globalVariable.baseURL
})
// 拼装url
function getUrl (url, params) {
    let i = 0
    if (!params) {
        params = {}
    }
    if (url.indexOf('/') !== 0) {
        url = '/' + url
    }
    if (url.indexOf('?') < 0) {
        url += '?'
    } else {
        url += '&'
    }
    for (let item in params) {
        i += 1
        if (typeof params[item] !== 'function') {
            url += encodeURIComponent(item) + '=' + encodeURIComponent(params[item]) + (i !== Object.getOwnPropertyNames(params).length ? '&' : '')
        }
    }
    // 去除accessToken校验
    // url += 'accessToken=' + token;
    return url
}
// Add a request interceptor
instance.interceptors.request.use(
    config => {
        return config
    },
    error => {
        // Do something with request error
        window.topVue.$Ctl.message(error, 'error')
        Promise.reject(error)
    }
)

// Add a response interceptor
instance.interceptors.response.use(function (response) {
    // Do something with response data
    // session 过期跳到登录页
    if (response.data.status === 170020 || response.data.status === 130001) {
        localStorage.removeItem('ilinkBs_sessionid')
        if (window.topVue.$Ctl.isCs()) {
            window.topVue.$Ctl.loading(0)
            // 调取c端退出登录事件
            window.topVue.$Cs.upsessionToCs()
        } else {
            let _platCode = localStorage.getItem('ilinkBs_platformCode')
            window.topVue.$router.push({path: '/login', query: (_platCode !== 'yxyljg' ? {loginId: _platCode} : {})})
        }
    } else {
        // response的头部是否返回了Authorization字段，若返回需要更新sessionid值
        if (response.headers.sessionid) {
            localStorage.setItem('ilinkBs_sessionid', response.headers.sessionid)
        }
        return response.data
    }
}, function (error) {
    // Do something with response error
    return Promise.reject(error)
})

/**
 *  暴露fetch方法，调用后台接口
 * @param url
 * @param params
 * @returns {Promise}
 */
const get = (url, params) => {
    return new Promise((resolve, reject) => {
        instance.get(getUrl(url, params))
            .then(response => {
                if (response) {
                    if (response.status !== 200) {
                        window.topVue.$Ctl.message(url + '：' + response.info, 'error')
                    } else {
                        resolve(response)
                    }
                }
            }, err => {
                reject(err)
            }).catch((error) => {
                reject(error)
            })
    })
}
const post = instance.post
const getRemoteFile = instance.get

export default {
    get,
    getRemoteFile,
    post
}
